package cn.wisco.util;

import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;
import java.util.Map;
import java.util.Set;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
@SuppressWarnings("unchecked")
public class JsonUtil {
	public static <T>T jsonToBean(String json,Class<T> clazz)
    {
        JSONObject jsonObject = JSONObject.fromObject(json);
        return (T)JSONObject.toBean(jsonObject,clazz);
    }
    @SuppressWarnings("deprecation")
    public static  <T>List<T>  jsonToList(String json,Class<T> clazz)
    {
        System.out.println("json:"+json);
        JSONArray arry=JSONArray.fromObject(json);
        return JSONArray.toList(arry,clazz);
    }
    public static  <T>T[] jsonToArray(String json,Class<T> clazz)
    {
        JSONArray arry=JSONArray.fromObject(json);
        return (T [])JSONArray.toArray(arry,clazz);
    }
    public static String listToJson(List<?> list)
    {
        return JSONSerializer.toJSON(list).toString();
    }
    
    public static String object2json(Object obj) {  
        StringBuilder json = new StringBuilder();  
        if (obj == null) {  
          json.append("");  
        } else if (obj instanceof String ||
             obj instanceof Integer ||
             obj instanceof Float  ||
             obj instanceof Boolean ||
             obj instanceof Short ||
             obj instanceof Double || 
             obj instanceof Long ||
             obj instanceof BigDecimal ||
             obj instanceof BigInteger || 
             obj instanceof Byte) {  
          json.append("\"").append(string2json(obj.toString())).append("\"");  
        } else if (obj instanceof Object[]) {  
          json.append(array2json((Object[]) obj));  
        } else if (obj instanceof List) {  
          json.append(list2json((List<?>) obj));  
        } else if (obj instanceof Map) {  
          json.append(map2json((Map<?, ?>) obj));  
        } else if (obj instanceof Set) {  
          json.append(set2json((Set<?>) obj));  
        } else {  
          json.append(bean2json(obj));  
        }  
        return json.toString();  
      }  
     
       
      public static String bean2json(Object bean) {  
        StringBuilder json = new StringBuilder();  
        json.append("{");  
        PropertyDescriptor[] props = null;  
        try {  
          props = Introspector.getBeanInfo(bean.getClass(), Object.class).getPropertyDescriptors();  
        } catch (IntrospectionException e) {}  
        if (props != null) {  
          for (int i = 0; i < props.length; i++) {  
            try {  
              String name = object2json(props[i].getName());  
              String value = object2json(props[i].getReadMethod().invoke(bean));  
              json.append(name);  
              json.append(":");  
              json.append(value);  
              json.append(",");  
            } catch (Exception e) {}  
          }  
          json.setCharAt(json.length() - 1, '}');  
        } else {  
          json.append("}");  
        }  
        return json.toString();  
      }
      
      public static String list2json(List<?> list) {  
    	    StringBuilder json = new StringBuilder();  
    	    json.append("[");  
    	    if (list != null && list.size() > 0) {  
    	      for (Object obj : list) {  
    	        json.append(object2json(obj));  
    	        json.append(",");  
    	      }  
    	      json.setCharAt(json.length() - 1, ']');  
    	    } else {  
    	      json.append("]");  
    	    }  
    	    return json.toString();  
    	  }  
       
      public static String array2json(Object[] array) {  
    	    StringBuilder json = new StringBuilder();  
    	    json.append("[");  
    	    if (array != null && array.length > 0) {  
    	      for (Object obj : array) {  
    	        json.append(object2json(obj));  
    	        json.append(",");  
    	      }  
    	      json.setCharAt(json.length() - 1, ']');  
    	    } else {  
    	      json.append("]");  
    	    }  
    	    return json.toString();  
    	  }  
      
      public static String map2json(Map<?, ?> map) {  
    	    StringBuilder json = new StringBuilder();  
    	    json.append("{");  
    	    if (map != null && map.size() > 0) {  
    	      for (Object key : map.keySet()) {  
    	        json.append(object2json(key));  
    	        json.append(":");  
    	        json.append(object2json(map.get(key)));  
    	        json.append(",");  
    	      }  
    	      json.setCharAt(json.length() - 1, '}');  
    	    } else {  
    	      json.append("}");  
    	    }  
    	    return json.toString();  
    	  }  
      
      public static String set2json(Set<?> set) {  
    	    StringBuilder json = new StringBuilder();  
    	    json.append("[");  
    	    if (set != null && set.size() > 0) {  
    	      for (Object obj : set) {  
    	        json.append(object2json(obj));  
    	        json.append(",");  
    	      }  
    	      json.setCharAt(json.length() - 1, ']');  
    	    } else {  
    	      json.append("]");  
    	    }  
    	    return json.toString();  
    	  }  
    	 
      public static String string2json(String s) {  
    	    if (s == null)  
    	      return "";  
    	    StringBuilder sb = new StringBuilder();  
    	    for (int i = 0; i < s.length(); i++) {  
    	      char ch = s.charAt(i);  
    	      switch (ch) {  
    	      case '"':  
    	        sb.append("\"");  
    	        break;  
    	      case '\\':  
    	        sb.append("\\");  
    	        break;  
    	      case 'b':  
    	        sb.append("\b");  
    	        break;  
    	      case 'f':  
    	        sb.append("\f");  
    	        break;  
    	      case 'n':  
    	        sb.append("\n");  
    	        break;  
    	      case 'r':  
    	        sb.append("\r");  
    	        break;  
    	      case 't':  
    	        sb.append("\t");  
    	        break;  
    	      case '/':  
    	        sb.append("\\/");  
    	        break;  
    	      default:  
    	        if (ch >= '\u0000' && ch <= '\u001F') {  
    	          String ss = Integer.toHexString(ch);  
    	          sb.append("\\u");  
    	          for (int k = 0; k < 4 - ss.length(); k++) {  
    	            sb.append('0');  
    	          }  
    	          sb.append(ss.toUpperCase());  
    	        } else {  
    	          sb.append(ch);  
    	        }  
    	      }  
    	    }  
    	    return sb.toString();  
    	  }  

}
